package modelo;

import java.util.Calendar;
import java.util.Observable;
import java.util.Observer;

import datos.InyectorDeDatos;


public class Caja implements Observer {
	private enum EstadoCaja { ABIERTA, CERRADA, VENTA_EN_CURSO }
	private EstadoCaja estadoCaja;
	private VentasRepository repositorioVentas;
	private OfertasRepository repositorioOfertas;
	private IVenta ventaEnCurso;
	private int cajaNro;
	private String sucursal;
	
	public int getCajaNro() {
		return cajaNro;
	}

	public String getSucursal() {
		return sucursal;
	}

	public Caja(int cajaNro, String sucursal) {
		this.repositorioVentas = new VentasRepository();
		this.repositorioOfertas = new OfertasRepository();
		InyectorDeDatos.inyectarOfertas(repositorioOfertas);
		this.cajaNro = cajaNro;
		this.sucursal = sucursal;
		ventaEnCurso = new Venta(repositorioOfertas, Calendar.getInstance(), cajaNro);
		estadoCaja = EstadoCaja.CERRADA;
	}
	
	public void abrirCaja(){
		if (estadoCaja == EstadoCaja.CERRADA)
			estadoCaja = EstadoCaja.ABIERTA;		
	}
	
	public void addProducto(Producto producto, int cantidad) {
		if (estadoCaja == EstadoCaja.VENTA_EN_CURSO)
			ventaEnCurso.addProducto(producto, cantidad);		
	}
	
	public void iniciarVenta() {
		if (estadoCaja == EstadoCaja.ABIERTA) {
			ventaEnCurso = new Venta(repositorioOfertas, Calendar.getInstance(), cajaNro);
			((Venta)ventaEnCurso).addObserver(this);
			estadoCaja = EstadoCaja.VENTA_EN_CURSO;
			imprimirCabecera();
		}
	}
		
	public void confirmarVenta(String formaDePago) {
		if (estadoCaja == EstadoCaja.VENTA_EN_CURSO) {
			ventaEnCurso.cobrar(formaDePago);
			imprimirTotal();
			repositorioVentas.add(ventaEnCurso);
			estadoCaja = EstadoCaja.ABIERTA;
		}
	}
	
	public void cancelarVenta() {
		if (estadoCaja == EstadoCaja.VENTA_EN_CURSO)
			estadoCaja = EstadoCaja.ABIERTA;
	}	
	
	public void cerrarVenta() {
		if (estadoCaja == EstadoCaja.ABIERTA)
			estadoCaja = EstadoCaja.CERRADA;
	}	

	@Override
	public void update(Observable o, Object arg) {
		imprimirLinea();		
	}
	
	private void imprimirLinea() {
		System.out.println(ventaEnCurso.getUltimoLineItem().toString());
	}
	
	private void imprimirTotal() {
		System.out.println("Total de la compra sin descuentos: " + ventaEnCurso.getTotalSinDescuentos());
		System.out.println("Total descuentos: " + ventaEnCurso.getTotalDescuentos());
		System.out.println("Total de la compra: " + ventaEnCurso.getTotal());
	}
	
	private void imprimirCabecera() {
		System.out.println("Sucursal: " + sucursal + " Caja: " + cajaNro);
	}	
}
